import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Maderota here.
 * 
 * @author Montes Alonso Irli Natali
 * @version Programacion Orientada a Objetos
 */
public class Maderota extends Portador
{
    private boolean band=true; //bamdera que detecta si ya fue tocada la madera por una piedra
    private boolean meEncontreCaja=false;
    private boolean yaNoEncontreCaja=false;
    private boolean seRoto=false;
    /**
     * metodo de actua, se checa si a la madera lo tocaron con el raton, si es asi se elimina, y checa si le 
     * cayo una piedra en cima.
     */
    public void act()
    {
        World mundo;
        mundo=super.getWorld();
        if(!meTocoUnRaton())    
        {
            if(band)
            {
                piedritaMeCayoEncima();
            }

            if(meEncontreUnaCaja())
                meEncontreCaja=true;

            if(yaNoEstaCaja())
                yaNoEncontreCaja=true; 

            if(maderaCae()==(400-1))
            {
                mundo.removeObject(this); 
                meEncontreCaja=true;
            }
        }
    }   

    /**
     * metodo para hacer que la madera caiga siempre y cuando no se encuentre con uan caja
     * @return cantidad variable que guarda la posicion en Y
     */
    public  int maderaCae()
    {  
        int posicionY;
        int baja=1,cantidad=0;
        if(!meEncontreCaja || !yaNoEncontreCaja)
        {   
            rotaMaderaInclinada();
            if(getY()>=0)
            {
                cantidad=(getY()+baja);
                setLocation(getX(),cantidad);
            }
        }
        meEncontreCaja=false;
        return cantidad;
    }

    /**
     * metodo para checar si la madera al caer encontro una caja
     * @return meEncontreCaja, regresa la variable conteniendo true o false dependiendo si encontro o no una caja
     */
    public boolean meEncontreUnaCaja()
    {
        Actor caja=super.getOneIntersectingObject(Cajas.class);

        if(caja!=null)
            meEncontreCaja=true;
        else
            meEncontreCaja=false;
        return meEncontreCaja;

    }

    /**
     * metodo que se utiliza para checar si no se encontro una caja y asi posteriormente hacer que caiga la madera nuevamente
     * @return yaNoEncontreCaja si ya no encontro caja regresa true
     */
    public boolean yaNoEstaCaja()
    {
        Actor cajita=super.getOneIntersectingObject(Caja1.class);

        if(cajita!=null)
            yaNoEncontreCaja=true;
        else
            yaNoEncontreCaja=false;
        return yaNoEncontreCaja;

    }

    /**
     * metodo para hacer que gire la madera 90 grados, dependiendo en que posición cayo la piedra, 
     * si cayo en el lado izquierdo del centro de la madera, esta rota a menos -90 grados y viceversa,
     * si la piedra cae hacia el otro extremo esta rotara 90 grados.
     * Al rotar la madera, los objetos que esten encima de ella tmb lo haran y se posicionaran de acuerdo
     * a la madera.
     * 
     * @parama p Identificador de a piedra que toco a la madera.
     */
    public void rotaMadera(Piedrita p)
    {
        int angulo=0;
        java.util.List listaObs;
        if(p.getX()<getX())
        {
            angulo=-90;
            listaObs=seEncuetraObstaculo();
            GreenfootImage ima= getImage();
            rotaMueveObstaculos(listaObs,angulo);
            setLocation(getX()-(ima.getWidth()/2),getY()-10);
            this.setRotation(angulo);

            band=false;
        }
        else
        {
            angulo=90;
            listaObs=seEncuetraObstaculo();
            GreenfootImage ima= getImage();
            rotaMueveObstaculos(listaObs,angulo);
            setLocation(getX()+(ima.getWidth()/2),getY()-10);
            this.setRotation(angulo);

            band=false;
        }
    }

    /**
     * metodo que checa si una piedra le cayo en cima a la madera, si es asi se manda llamar al metodo de
     * rotaMadera para hacer girar a la madera.
     */
    public void piedritaMeCayoEncima()
    {
        Piedrita piedra=(Piedrita)super.getOneIntersectingObject(Piedrita.class);
        Caja2 caja = (Caja2)super.getOneIntersectingObject(Caja2.class);
        if(piedra!=null&& caja==null)
            rotaMadera(piedra);
    }

    /**
     * metodo que rota todos los obstaculos que se encuentren sobre la madera
     * @param obtaculos lista que contiene los obstaculos que se encuentran sobre la madera
     * @param angulo entero que contiene el angulo en el cual los objetos se rotaran con la madera
     */
    public void rotaMueveObstaculos(java.util.List obstaculos, int angulo)
    { 
        Obstaculo obs;
        GreenfootImage ima= getImage();
        int ini= getX()-(ima.getWidth()/2),fin=getX()+(ima.getWidth()/2);
        int iniY;
        int distancia;
        int diferencia;
        if(obstaculos!=null)
        {
            if(angulo==-90)
                for(int i=0; i<obstaculos.size();i++)
                {                
                    obs=(Obstaculo)obstaculos.get(i);
                    diferencia=getY()-obs.getY();
                    distancia=obs.getX()-ini;
                    iniY=getY()-10+(ima.getWidth()/2);
                    obs.setLocation(ini-diferencia,iniY-distancia);
                    obs.setRotation(angulo);
            }
            else
                for(int i=0; i<obstaculos.size();i++)
                {                
                    obs=(Obstaculo)obstaculos.get(i);
                    diferencia=getY()-obs.getY();
                    distancia=obs.getX()-ini;
                    iniY=getY()-10+(ima.getWidth()/2);
                    obs.setLocation(fin+diferencia,iniY-distancia);
                    obs.setRotation(angulo);
            }

        }
    }

    /**
     * metodo para hacer que al rotar la madera tambien roten los obstaculos que esten encima de el
     */
    public void rotaMueveObstaculosInclinados(java.util.List obstaculos, int anguloanterior, int angulonew,int movx)
    { 
        Obstaculo obs;
        GreenfootImage ima= getImage();

        int ini= getX()-(ima.getWidth()/2);
        int iniY;
        int distancia;
        int diferencia;
        if(obstaculos!=null)
        {
            for(int i=0; i<obstaculos.size();i++)
            {                
                obs=(Obstaculo)obstaculos.get(i);
                diferencia=obs.getY()-getY();
                obs.setLocation(obs.getX()+movx,obs.getY()-diferencia-ima.getHeight());
            }
        }
    }

    /**
     * metodo para hacer que la madera se rote dependiendo del angulo en que se encuentre
     */
    public void rotaMaderaInclinada()
    {
        Actor caja=super.getOneIntersectingObject(Caja2.class);
        java.util.List listaObs;
        listaObs=seEncuetraObstaculo();

        int angulo= this.getRotation();
        if(caja!=null&&!seRoto)
        {

            if(caja.getX()>this.getX())
            {
                rotaMueveObstaculosInclinados(listaObs,angulo,360-angulo,-55);
                this.setLocation(getX()-50,getY());

            }
            else
            {
                rotaMueveObstaculosInclinados(listaObs,angulo,360-angulo,55);
                this.setLocation(getX()+50,getY());

            }
            this.setRotation(360-angulo);
            seRoto=true;
        }

    }

}
